package io.easyspring.invitation.core;

import io.easyspring.invitation.core.support.EasyInvitation;
import org.springframework.validation.annotation.Validated;

import javax.validation.Valid;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * 邀请信息的处理器
 *
 * @author summer
 * @version 2.0.0-RELEASE
 * DateTime 2019-06-22 12:54
 */
@Validated
public interface InvitationProcessor<T extends EasyInvitation> {

    /**
     * 发送邀请的方法
     *
     * @param easyInvitation 邀请信息
     * @param expires 有效时长
     * @return T
     * Author summer
     * Version 2.0.0-RELEASE
     * DateTime 2019-06-22 13:21
     */
    T send(@NotNull(message = "邀请信息不能为空") @Valid
                                T easyInvitation,
           @Min(value = 10, message = "有效时长不能小于 10") Long expires);

    /**
     * 撤销邀请信息的方法
     *
     * @param inviterId 邀请者 id
     * @param verificationCode 邀请验证码
     * Author summer
     * Version 2.0.0-RELEASE
     * DateTime 2019-06-22 13:36
     */
    int recall(@NotNull(message = "邀请者 id 不能为空") @Min(value = 0, message = "邀请者 id 不合法")
                        Long inviterId,
                @NotBlank(message = "验证码不能为空") String verificationCode);

    /**
     * 获取单个邀请信息的方法
     *
     * @param inviterId 邀请者 id
     * @param verificationCode 验证码
     * @return T
     * Author summer
     * Version 2.0.0-RELEASE
     * DateTime 2019-06-22 17:33
     */
    T get(@NotNull(message = "邀请者 id 不能为空") @Min(value = 0, message = "邀请者 id 不合法")
                  Long inviterId,
          @NotBlank(message = "验证码不能为空") String verificationCode);

    /**
     * 根据邀请者 id 获取其所有邀请信息的方法
     *
     * @param inviterId 邀请者 id
     * @return java.util.List<T>
     * Author summer
     * Version 2.0.0-RELEASE
     * DateTime 2019-06-22 13:39
     */
    List<T> list(@NotNull(message = "邀请者 id 不能为空") @Min(value = 0, message = "邀请者 id 不合法")
                                      Long inviterId);
}
